#赋值运算符
class A1
    def initialize(a=1)
        @a1=a
    end
    attr_accessor:a1
end
a1=A1.new(1)
p a1.a1+=1 #同时调用了reader和writer

#逻辑运算符 || &&
p 1===2||"张天泽" # var||"张天泽"返回的是var引用对象时的值，var为nil,false时 "张天泽"
ary=nil
p name=ary&&ary.first #当ary不是nil(false)时返回ary.first，否则返回ary
#安全运算符（nil检查调用）
#对象&.方法
#上式可改为 p name=ary.&first 
p ary||=4 # var=var||4

#条件运算符（三元）
a=1
b=2
max=(a>b)?a:b

#范围运算符
print (1..3).to_a,("a"..."c").to_a,"\n"

#(重)定义运算符
#不能重定义 :: && || .. ... ?: not = and or
#二元运算符
class Point
    attr_accessor:x,:y
    def initialize(x=0,y=0)
        @x,@y=x,y
    end
    def inspect #用p方法显示
        "(#{x},#{y})"
    end
    def +(p)
        self.class.new(x+p.x,y+p.y) #相当于 Point.new(x+p.x,y+p.y) 
    end
    def -(p)
        self.class.new(x-p.x,y-p.y)
    end
end
p1=Point.new(1,2)
p2=Point.new(3,4)
p p1+p2,p1-p2
#一元运算符(+@,-@,~@,!@)
class Point
    def +@
        dup #自己的副本
    end
    def -@
        self.class.new(-x,-y)
    end
    def ~@
        self.class.new(-y,x)
    end
    def !@
        self.class.new(0,0)
    end
end
p +p1,-p1,~p1,!p1

#下标方法
class Point
    def [](index)
        case index
        when 0
            x
        when 1
            y
        else
            raise ArgumentError,"out of range '#{index}'"
        end
    end
    def []=(index,val)
        case index
        when 0
            self.x=val
        when 1
            self.y=val
        else 
            raise ArgumentError,"out of range '#{index}'"
        end
    end
end
p p1[0],p1[1]=9

#优先级
=begin 高
::
[]
+(一元) ! ~
**
-(一元)
* / %
+ -
<< >>
&
| ^
> >= < <=
<=> == === != =~ !~
&&
||
?:(条件)
.. ...
=(包含+= -= *= /=等)
not
and or
低 
=end